package com.example.demo.algorithm.lru_lfu;

import java.util.LinkedHashMap;

/**
 * LRU，Least Recently Used，最近最少使用算法。判断最近被使用的时间，目前最远的数据优先被淘汰。简单地说，LRU 的淘汰规则是基于访问时间。
 * 如果一个数据在最近一段时间没有被使用到，那么可以认为在将来它被使用的可能性也很小。因此，当缓存空间满时，最久没有使用的数据最先被淘汰。
 * 在Java中，其实LinkedHashMap已经实现了LRU缓存淘汰算法，需要在构造函数第三个参数传入true，表示按照时间顺序访问。可以直接继承LinkedHashMap来实现。
 * @param <K>
 * @param <V>
 */
public class LruCache<K,V> extends LinkedHashMap<K,V>{
    /**
     * 容量限制
     */
    private int capacity;

    LruCache(int capacity){
        // 初始大小，0.75是装载因子，true是表示按照访问时间排序
        super(capacity,0.75f,true);
        this.capacity = capacity;
    }

    /**
     * 重写LinkedHashMap中的removeEldestEntry方法，当LRU中元素多余capacity时，删除最老的元素
     */
    @Override
    protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
        return size() > capacity;
    }
}
